Add gtk_event_controller_get_current_event[_state]
authorMatthias Clasen <mclasen@redhat.com>
Sat, 11 Apr 2020 16:40:21 +0000 (12:40 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 11 Apr 2020 21:29:27 +0000 (17:29 -0400)
For now these are private, to replace internal uses
of gtk_get_current_event[_state], but we may want to
make them public.

docs/reference/gtk/gtk4-sections.txt
gtk/gtkeventcontroller.c
gtk/gtkeventcontroller.h
gtk/gtkeventcontrollerprivate.h

index 98d7fed3aa8698c483344112ac70fb78947538fb..64c459a19729fbc5c3a0c3fbf59267d1c325433d 100644 (file)
@@ -5815,6 +5815,12 @@ gtk_event_controller_set_propagation_limit
 gtk_event_controller_get_widget
 gtk_event_controller_reset
 
+<SUBSECTION>
+gtk_event_controller_get_current_event
+gtk_event_controller_get_current_event_device
+gtk_event_controller_get_current_event_state
+gtk_event_controller_get_current_event_time
+
 <SUBSECTION Standard>
 GTK_TYPE_EVENT_CONTROLLER
 GTK_EVENT_CONTROLLER
index f8a9d701ddd66ba6e6b1bbd6af71b088e2c768e0..824e75b9838e9fba14c780117b20b9e84d9fcefb 100644 (file)
@@ -59,6 +59,7 @@ struct _GtkEventControllerPrivate
   GtkPropagationLimit limit;
   char *name;
   GtkWidget *target;
+  GdkEvent *event;
 };
 
 G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkEventController, gtk_event_controller, G_TYPE_OBJECT)
@@ -337,13 +338,15 @@ gtk_event_controller_handle_event (GtkEventController *controller,
 
   controller_class = GTK_EVENT_CONTROLLER_GET_CLASS (controller);
 
-  priv->target = target;
+  priv->target = g_object_ref (target);
+  priv->event = gdk_event_ref (event);
 
   g_object_ref (controller);
   retval = controller_class->handle_event (controller, event, x, y);
   g_object_unref (controller);
 
-  priv->target = NULL;
+  g_clear_object (&priv->target);
+  g_clear_pointer (&priv->event, gdk_event_unref);
 
   return retval;
 }
@@ -532,6 +535,83 @@ gtk_event_controller_get_target (GtkEventController *controller)
   return priv->target;
 }
 
+/**
+ * gtk_event_controller_get_current_event:
+ * @controller: a #GtkEventController
+ *
+ * Returns the event that is currently being handled by the
+ * controller, and %NULL at other times.
+ *
+ * Returns: (nullable) the event is current handled by @controller
+ */
+GdkEvent *
+gtk_event_controller_get_current_event (GtkEventController *controller)
+{
+  GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (controller);
+
+  return priv->event;
+}
+
+/**
+ * gtk_event_controller_get_current_event_time:
+ * @controller: a #GtkEventController
+ *
+ * Returns the timestamp of the event that is currently being
+ * handled by the controller, and 0 otherwise.
+ *
+ * Returns: timestamp of the event is current handled by @controller
+ */
+guint32
+gtk_event_controller_get_current_event_time (GtkEventController *controller)
+{
+  GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (controller);
+
+  if (priv->event)
+    return gdk_event_get_time (priv->event);
+
+  return 0;
+}
+
+/**
+ * gtk_event_controller_get_current_event_device:
+ * @controller: a #GtkEventController
+ *
+ * Returns the device of the event that is currently being
+ * handled by the controller, and %NULL otherwise.
+ *
+ * Returns: (nullable): device of the event is current handled by @controller
+ */
+GdkDevice *
+gtk_event_controller_get_current_event_device (GtkEventController *controller)
+{
+  GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (controller);
+
+  if (priv->event)
+    return gdk_event_get_device (priv->event);
+
+  return NULL;
+}
+
+/**
+ * gtk_event_controller_get_current_event_device:
+ * @controller: a #GtkEventController
+ *
+ * Returns the modifier state of the event that is currently being
+ * handled by the controller, and 0 otherwise.
+ *
+ * Returns: (nullable): modifier state of the event is current handled by @controller
+ */
+GdkModifierType
+gtk_event_controller_get_current_event_state (GtkEventController *controller)
+{
+  GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (controller);
+
+  if (priv->event)
+    return gdk_event_get_modifier_state (priv->event);
+
+  return 0;
+}
+
 static GtkCrossingData *
 gtk_crossing_data_copy (GtkCrossingData *crossing)
 {
index 6bdcfbb678fa89274d5ce4fd7d168a24c7bd4144..4b33432895b38faa4963a0f3d2cc7a7adf44bc66 100644 (file)
@@ -72,6 +72,15 @@ GDK_AVAILABLE_IN_ALL
 void                gtk_event_controller_set_name              (GtkEventController *controller,
                                                                 const char         *name);
 
+GDK_AVAILABLE_IN_ALL
+GdkEvent *          gtk_event_controller_get_current_event    (GtkEventController *controller);
+GDK_AVAILABLE_IN_ALL
+guint32             gtk_event_controller_get_current_event_time   (GtkEventController *controller);
+GDK_AVAILABLE_IN_ALL
+GdkDevice *         gtk_event_controller_get_current_event_device (GtkEventController *controller);
+GDK_AVAILABLE_IN_ALL
+GdkModifierType     gtk_event_controller_get_current_event_state (GtkEventController *controller);
+
 G_END_DECLS
 
 #endif /* __GTK_EVENT_CONTROLLER_H__ */
index 571d78f96052da15e01e34fdb35b42ec8e902838..c997f7951ee61ba8999dd957bbbc39f2d1843f60 100644 (file)
@@ -100,7 +100,8 @@ struct _GtkEventControllerClass
   gpointer padding[10];
 };
 
-GtkWidget *gtk_event_controller_get_target (GtkEventController *controller);
+GtkWidget * gtk_event_controller_get_target (GtkEventController *controller);
+
 
 gboolean   gtk_event_controller_handle_event   (GtkEventController *controller,
                                                 GdkEvent           *event,